//! 存储模块 - 区块链数据持久化

use std::fs;
use serde_json;
use crate::blockchain::Blockchain;

/// 将区块链保存到JSON文件
/// # 参数
/// - blockchain: 区块链实例  
/// - filename: 存储文件名
pub fn save_blockchain(blockchain: &Blockchain, filename: &str) {
    // 序列化区块链数据
    let json = serde_json::to_string(blockchain.chain())
        .unwrap(); // .expect("区块链序列化失败");
    
    // 写入文件（覆盖模式）
    fs::write(filename, json)
        .unwrap(); // .expect("文件写入失败");
}

/// 从JSON文件加载区块链
/// # 参数
/// - filename: 存储文件名  
/// - difficulty: 新链的初始难度  
/// # 返回
/// 加载的区块链实例（失败时返回新链）
pub fn load_blockchain(filename: &str, difficulty: usize) -> Blockchain {
    // 读取文件内容（失败时返回空数组）
    let json = fs::read_to_string(filename)
        .unwrap_or_else(|_| "[]".to_string());
    
    // 反序列化区块数据（失败时返回空列表）
    let chain: Vec<crate::block::Block> = serde_json::from_str(&json)
        .unwrap_or_default();
    
    // 创建新区块链实例
    let mut blockchain = Blockchain::new(difficulty);
    
    // 加载成功时替换链数据
    if !chain.is_empty() {
        *blockchain.chain_mut() = chain;
    }
    
    blockchain
}